using GamFi.Admin.API.Application.Exceptions;
using GamFi.Admin.API.Application.Resources;
using GamFi.Admin.API.Domain.Entities;
using MediatR;
using Microsoft.Extensions.Localization;
using MongoDB.Driver;

namespace GamFi.Admin.API.Application.Features.Queries.Chat.AddMessage;

/// <summary>
/// Обработчик команды на добавление нового сообщения в чат.
/// </summary>
public class AddMessageCommandHandler : IRequestHandler<AddMessageCommand, Unit>
{
    private readonly IMongoDatabase _database;
    private readonly IStringLocalizer<ExceptionMessages> _localizer;

    /// <summary>
    /// Конструктор обработчика команды на добавление нового сообщения в чат.
    /// </summary>
    /// <param name="database">Контекст базы данных.</param>
    /// <param name="localizer">Локализатор исключений.</param>
    public AddMessageCommandHandler(IMongoDatabase database, IStringLocalizer<ExceptionMessages> localizer)
    {
        _database = database;
        _localizer = localizer;
    }

    /// <summary>
    /// Обработка команды на добавление нового сообщения в чат.
    /// </summary>
    /// <param name="request">Команда на добавление нового сообщения.</param>
    /// <param name="cancellationToken">Токен для отмены операции.</param>
    /// <returns>Результат выполнения команды.</returns>
    [Obsolete("Obsolete")]
    public async Task<Unit> Handle(AddMessageCommand request, CancellationToken cancellationToken)
    {
        // Проверка на null-значение запроса
        if (request is null)
            throw new RequestException(_localizer[nameof(RequestException.RequestIsEmpty)]);

        // Проверка на пустое сообщение
        if (string.IsNullOrWhiteSpace(request.TextMessage))
            throw new ChatException(_localizer[nameof(ChatException.MessageIsEmpty)]);

        // Создание объекта сообщения
        var message = new Message
        {
            TextMessage = request.TextMessage,
            CreatedBy = request.CreatedBy.ToString(),
            CreatedDate = request.CreatedDate,
        };

        // Добавление сообщения в базу данных
        var messagesCollection = _database.GetCollection<Message>("Messages");
        await messagesCollection.InsertOneAsync(message, cancellationToken);

        return Unit.Value;
    }
}